class PleitosController < ApplicationController

  # FIXME restfulx não consegue enviar solicitação
  skip_before_filter :verify_authenticity_token

  filter_access_to :all, :attribute_check => true
  filter_access_to :create, :index, :update, :registrar_protocolo, :registrar_documentos_adicionais,
                   :aceitar_inscricao, :rejeitar_inscricao, :documentos_requeridos, :distribuir

  before_filter    :get_pleito, :only => [:registrar_protocolo, :registrar_documentos_adicionais, :sugestoes,
                   :aceitar_inscricao, :rejeitar_inscricao, :documentos_requeridos, :distribuir]

  before_filter    :set_responsavel, :only => [:documentos, :cadastro_empreendimento, :requerimento, :form_caracterizacao]

  include Reports

  def documentos
    respond_to_report 'documentos', 'documentacao/main'
  end

  def cadastro_empreendimento
    respond_to_report 'cadastro_empreendimento'
  end

  def requerimento
    respond_to_report 'requerimento'
  end

  def form_caracterizacao
    report = "caracterizacao/#{@pleito.mnemonic}"
    unless @pleito.reducao?
      report = @pleito.form_codes(:caracterizacao).map{|code| "#{report}/#{code}"}
    end
    respond_to_report "caracterizacao", report
  end

  def vistoria
    respond_to_report 'vistoria', 'analise/vistoria/main'
  end

  def laudo
    report_params = params[:minuta] ? {"MINUTA" => true} : nil
    respond_to_report 'laudo', "laudo/#{@pleito.mnemonic}", report_params
  end

  def analise
    reports      = %w(analise/main common/documentacao_apresentada)
    reports.concat %w(analise/anexo1 analise/anexo2) if @pleito.reinvestimento?
    reports     << 'analise/anexo_vendas'
    respond_to_report 'analise', reports
  end

  def portaria
    report_params = params[:minuta] ? {"MINUTA" => true} : nil
    reports = ['analise/portaria']
    reports << 'analise/anexo1' if @pleito.reinvestimento?
    respond_to_report 'portaria', reports, report_params
  end

  def deliberacao
    respond_to_report 'deliberacao'
  end

  def oficio
    @tipo_oficio = (params[:tipo] || "receita").to_sym
    @fase_oficio = params[:fase].try(:to_sym)
    respond_to_report 'oficio'
  end

  def registrar_protocolo
    @pleito.registrar_protocolo(current_user, params[:numero_protocolo], params[:data_protocolo])
    montar_fxml
  end

  def registrar_documentos_adicionais
    @pleito.update_attribute(:documentos_adicionais, params[:documentos_adicionais])
    montar_fxml
  end

  def rejeitar_inscricao
    @pleito.rejeitar_inscricao(current_user, params[:complemento1], params[:complemento2])
    montar_fxml
  end

  def aceitar_inscricao
    @pleito.status = "DocVencida" unless @pleito.aceitar_inscricao(current_user, params[:numero_processo], params[:data_processo],
      params[:codigo_arquivo], params[:complemento1])
    montar_fxml
  end

  def encaminhar_para_certificacao
    @pleito.encaminhar_para_certificacao(current_user, params[:texto])
    montar_fxml
  end

  def encaminhar_para_recomendacao
    @pleito.encaminhar_para_recomendacao(current_user, params[:texto])
    montar_fxml
  end

  def encaminhar_para_deliberacao
    @pleito.encaminhar_para_deliberacao(current_user, params[:texto])
    montar_fxml
  end

  def aprovar
    @pleito.aprovar(current_user, params[:texto], params[:data], params[:numero])
    montar_fxml
  end

  def voltar_para_analise
    @pleito.voltar_para_analise(current_user, params[:texto])
    montar_fxml
  end

  def arquivar
    @pleito.arquivar(current_user, params[:texto])
    montar_fxml
  end

  def modificar_data_portaria
    @pleito.modificar_data_portaria(params[:data], params[:numero])
    montar_fxml
  end

  def modificar_data_laudo
    @pleito.modificar_data_laudo(params[:data], params[:numero])
    montar_fxml
  end

  def modificar_data_oficio_empresa
    @pleito.modificar_data_oficio_empresa(params[:data], params[:numero])
    montar_fxml
  end

  def modificar_data_oficio_empresa_liberacao
    @pleito.modificar_data_oficio_empresa_liberacao(params[:data], params[:numero])
    montar_fxml
  end

  def modificar_data_oficio_receita
    @pleito.modificar_data_oficio_receita(params[:data], params[:numero])
    montar_fxml
  end

  def modificar_data_oficio_bnb
    @pleito.modificar_data_oficio_bnb(params[:data], params[:numero])
    montar_fxml
  end

  def modificar_data_oficio_marinha
    @pleito.modificar_data_oficio_marinha(params[:data], params[:numero])
    montar_fxml
  end

  def documentos_requeridos
    render :fxml => @pleito.documentos.to_fxml(:only => [:id, :descricao, :expiravel, :ativo, :obrigatorio])
  end

  def distribuir
    @pleito.registrar_analistas(current_user, params[:analista_1_id], params[:analista_2_id])
    montar_fxml
  end

  def index
    if params[:status]
      @pleitos = Pleito.find_all_by_status(params[:status].split(','), :order => "codigo")
      respond_to do |format|
        format.fxml do
          render :fxml => (@pleitos || []).to_fxml(
          :only => [:id, :codigo, :cnpj, :razao_social, :status, :numero_protocolo, :data_protocolo, :numero_processo, :codigo_arquivo, :documentos_adicionais, :name, :cpf],
          :include => {:empreendimento => {:include => [:pj_objeto, :pj_titular]},
                       :incentivo => {:only => [:id, :mnemonic, :descricao]},
                       :analise => {:include => [:analista_1, :analista_2]},
                       :documentos_apresentados => {:only => [:id, :entregue, :emissao, :validade, :observacao],
                                                    :include => {:documento => {:only => [:id, :descricao, :descricao_breve, :expiravel, :ativo, :obrigatorio]}}}})
        end
      end
    elsif params[:search]
      @pleitos = Pleito.search(params[:search]).all
      montar_fxml_search
    end
  end

  def show
    respond_to do |format|
      format.fxml {}
    end
  end

  def create
    @pleito = Pleito.new(params[:pleito])
    if @pleito.iniciar_inscricao(current_user)
      redirect_to [:edit, @pleito, :empreendimento, :pessoa_juridica]
    else
      flash[:error] = "Erro ao iniciar inscrição do pleito."
      redirect_to root_path
    end
  end

  private

  def get_pleito
    @pleito = Pleito.find(params[:id])
  end

  def set_responsavel
    @pleito.responsavel_id = params[:pleito][:responsavel_id] if params[:pleito]
  end

  def montar_fxml
    render :fxml => @pleito.to_fxml(
        :only => [:id, :codigo, :cnpj, :razao_social, :status, :numero_protocolo, :data_protocolo, :numero_processo,
                  :codigo_arquivo, :documentos_adicionais, :name, :cpf,
                  :data_portaria, :numero_portaria,
                  :data_laudo, :numero_laudo,
                  :data_oficio_empresa, :numero_oficio_empresa,
                  :data_oficio_empresa_liberacao, :numero_oficio_empresa_liberacao,
                  :data_oficio_receita, :numero_oficio_receita,
                  :data_oficio_bnb, :numero_oficio_bnb,
                  :data_oficio_marinha, :numero_oficio_marinha],
        :include => {:empreendimento => {:include => :pj_titular},
                      :incentivo => {:only => [:id, :mnemonic, :descricao]},
                     :analise => {:include => [:analista_1, :analista_2]}})
  end

  def montar_fxml_search
    render :fxml => @pleitos.to_fxml( :only    => [ :id, :codigo, :cnpj, :razao_social, :status, :numero_protocolo, :data_protocolo, :numero_processo,
                                                    :codigo_arquivo, :documentos_adicionais, :name, :cpf,
                                                    :data_portaria, :numero_portaria,
                                                    :data_laudo, :numero_laudo,
                                                    :data_oficio_empresa, :numero_oficio_empresa,
                                                    :data_oficio_empresa_liberacao, :numero_oficio_empresa_liberacao,
                                                    :data_oficio_receita, :numero_oficio_receita,
                                                    :data_oficio_bnb, :numero_oficio_bnb,
                                                    :data_oficio_marinha, :numero_oficio_marinha],
                                      :methods => [ :tipo_projeto_descricao ],
                                      :include => { :empreendimento => { :include => { :pj_objeto => { :only    => [ :id, :cnpj, :razao_social],
                                                                                                       :include => { :contato => { :only    => [:id],
                                                                                                                                   :include => { :municipio => { :only    => [:id],
                                                                                                                                                                 :include => { :estado => { :only => [:id, :uf] } } } } } } },
                                                                                       :pj_titular => { :only    => [ :id, :cnpj, :razao_social],
                                                                                                        :include => { :contato => { :only    => [:id],
                                                                                                                                    :include => { :municipio => { :only    => [:id],
                                                                                                                                                                  :include => { :estado => { :only => [:id, :uf] } } } } } } },
                                                                                                                                                                   } },
                                                    :incentivo => { :only => [:id, :mnemonic, :descricao] },
                                                  })
  end

  def respond_to_report(action, reports = "#{action}/main", report_params = nil)
    path = "#{@pleito.codigo}/#{action}"
    respond_to do |format| # TODO usar links com extensao pdf e fazer format.pdf no lugar de format.html
      format.html do
        xml = render_to_string :action => action, :type => :xml, :layout => false
        generate_report reports, path, xml, report_params
      end
      format.xml { render :action => action }
    end
  end

end
